/*
* ----------------------------------------------------------------
* Copyright Backbase b.v. 2003/2012
* All rights reserved.
* ----------------------------------------------------------------
* Version 5.5
* Author : Backbase R&D - Amsterdam - New York
* ----------------------------------------------------------------
*/
new function(){
// ----
// Reflector based control space
// ----
var DOMReflector = b$.bdom.util.DOMReflector;
var RFL_DOM2Control = b$.bdom.util.RFL_DOM2Control;
/**
* This reflection is a controller for catalogs, portals and applications. It links the model element to a view element.
* You need to register each reflection in a reflector of type b$.bdom.util.DOMReflector
.
* For registering a reflection, you can use a short-hand in the config
parameter.
* @param {Function} config Key-value pairs that are parsed as properties of the new reflection.
* For example, setting config to the following value:
*
* {'match':'Catalog','localName':'catalog'} ** Will generate a new reflection with property
match
set to Catalog
and property localName
set to catalog
.
* @extends b$.bdom.util.RFL_DOM2Control
* @ignore
*/
var RFL_PortalModel2Control = RFL_DOM2Control.extend(null,{
ns: 'http://backbase.com/2012/portalView',
localName: 'baseElement',
getNS: function(model) {
var sLocalName = this.getLocalName(model);
if (b$.bdom.namespaces['http://backbase.com/2013/portalView'] && b$.bdom.namespaces['http://backbase.com/2013/portalView'].classes[sLocalName]) {
return 'http://backbase.com/2013/portalView';
} else if (b$.bdom.namespaces['http://backbase.com/2012/portalView'] && b$.bdom.namespaces['http://backbase.com/2012/portalView'].classes[sLocalName]) {
return 'http://backbase.com/2012/portalView';
};
return this.ns;
},
initInstance: function(bdom, model) {
bdom.model = model;
// attachBehaviors(model, bdom);
// copyPrefs(model, bdom);
}
});
// var XXXXXRFL_PM2Catalog = RFL_PortalModel2Control.extend(null,{
// localName:'catalog',
// initInstance:function(bdom, model) {
// bdom.model = model;
// attachBehaviors(model, bdom);
// copyPrefs(model, bdom);
// }
// });
/**
* This reflection is a controller for containers, links and pages. It links the model element to a view element.
* You need to register each reflection in a reflector of type b$.bdom.util.DOMReflector
.
* For registering a reflection, you can use a short-hand in the config
parameter.
* @class
* @param {Function} config Key-value pairs that are parsed as properties of the new reflection.
* For example, setting config to the following value:
* * {'match':'Container','localName':'container'} ** Will generate a new reflection with property
match
set to Container
and property localName
set to container
.
* Please note that the getLocalName
method overrides the default localName
value, based on the TemplateName
property.
* @extends b$.bdom.util.RFL_PortalModel2Control
* @ignore
*/
var RFL_PM2CtrlwithTemplateName = RFL_PortalModel2Control.extend(null,{
getNS: function(model) {
if (this.localName.toLowerCase() == 'container') {
var sLocalName = model.originalItem.preferences['TemplateName'].value;
};
if (this.localName.toLowerCase() == 'page') {
var sLocalName = this.getLocalName(model);
// return 'http://backbase.com/2012/portalView';
};
// TODO check if 2013 namspace exists
if (model.getAttribute('viewNamespace')) {
return model.getAttribute('viewNamespace');
} else if (b$.bdom.namespaces['http://backbase.com/2013/portalView'] && b$.bdom.namespaces['http://backbase.com/2013/portalView'].classes[sLocalName]) {
return 'http://backbase.com/2013/portalView';
} else if (b$.bdom.namespaces['http://backbase.com/2012/portalView'] && b$.bdom.namespaces['http://backbase.com/2012/portalView'].classes[sLocalName]) {
return 'http://backbase.com/2012/portalView';
};
return this.ns;
},
/**
* Returns a portal view class based on the TemplateName
property of model
.
* @param {backbase.com.2012.portalModel.Item} model
* @return {backbase.com.2012.portalView.[TemplateName]} A portal view class that corresponds to the TemplateName
property of model
.
* If none exists, falls back to backbase.com.2012.portalView.baseElement
.
* @ignore
*/
getLocalName: function(model) {
var sViewClass = this.localName;
var p = model.originalItem.preferences['TemplateName'];
// TODO check if 2013 namspace exists
if (model.getAttribute('viewNamespace')) {
sViewClass = p.value;
} else if (p && b$.bdom.namespaces['http://backbase.com/2013/portalView'] && b$.bdom.namespaces['http://backbase.com/2013/portalView'].classes[p.value]) {
sViewClass = p.value;
} else if (p && b$.bdom.namespaces['http://backbase.com/2012/portalView'] && b$.bdom.namespaces['http://backbase.com/2012/portalView'].classes[p.value]) {
sViewClass = p.value;
}
// check here?
// if (p) // check here?
// console.log(p.value)
// console.log('sViewClass '+sViewClass)
return sViewClass;
},
initInstance:function(bdom, model) {
bdom.model = model;
attachBehaviors(model, bdom);
copyPrefs(model, bdom);
}
});
/**
* This reflection is a controller for widgets. It links the model element to a view element.
* You need to register each reflection in a reflector of type b$.bdom.util.DOMReflector
.
* For registering a reflection, you can use a short-hand in the config
parameter.
* @class
* @param {Function} config Key-value pairs that are parsed as properties of the new reflection.
* For example, setting config to the following value:
* * {'match':'Widget','localName':'widget'} ** Will generate a new reflection with property
match
set to Widget
and property localName
set to widget
.
* Please note that the getLocalName
method overrides the default localName
value, based on the TemplateName
property.
* @extends b$.bdom.util.RFL_PortalModel2Control
* @ignore
*/
var RFL_PM2Widget = RFL_PortalModel2Control.extend(null,{
localName:'widget',
/**
* Returns a portal view class for a Backbase widget or a W3C widget based on the TemplateName
property of model
,
* which should be either Standard_Widget
or W3C_Widget
.
* @param {backbase.com.2012.portalModel.Item} model
* @return {backbase.com.2012.portalView.backbaseWidget / backbase.com.2012.portalView.w3cWidget} Returns the backbaseWidget
class when the TemplateName
property of model
is
* Standard_Widget
, or the w3cWidget
class when the TemplateName
property is W3C_Widget
.
* If the TemplateName
property has a different value, falls back to backbase.com.2012.portalView.widget
.
* @ignore
*/
getLocalName: function(model) {
var sViewClass = 'widget';
var p = model.originalItem.preferences['TemplateName'];
if (p) {
if (p.value == 'Standard_Widget') {
sViewClass = 'backbaseWidget';
}
else if (p.value == 'W3C_Widget') {
sViewClass = 'w3cWidget';
}
}
/*
// OLD CODE... Deprecated....Removed....
var p = bnode.originalItem.preferences['template'];
if (p) {
if (p.value == 'backbase')
sViewClass = 'backbaseWidget';
else if (p.value == 'w3c')
sViewClass = 'w3cWidget';
else if (p.value == 'dashboard')
sViewClass = 'DashboardWidget';
}
2*/
return sViewClass;
},
initInstance:function(bdom, model) {
bdom.model = model;
attachBehaviors(model, bdom);
copyPrefs(model, bdom);
}
});
function copyPrefs(model, bdom) {
for (var i = 0, l = model.preferences.array.length; i < l; i++){
var p = model.preferences.array[i];
bdom.setAttribute(p.name, p.value);
}
}
/**
* Registers JS functions stored in the behaviors
property of the specified object as event listeners to the specified node.
* @param {backbase.com.2012.portalModel.Item} object
* @param {b$.bdom.Node} node
* @ignore
*/
var attachBehaviors = function(model, node){
var behaviorsPref = model.getPreference('behaviors') || '';
var behaviorProviders = behaviorsPref.split(' ');
for (var i = 0, l = behaviorProviders.length; i < l; i++) {
try {
// var behaviorProvider = b$.require(behaviorProviders[i]);
var behaviorProvider = require(behaviorProviders[i]);
if (behaviorProvider && behaviorProvider.behaviors) {
for (var h in behaviorProvider.behaviors){
if (behaviorProvider.behaviors.hasOwnProperty(h)) {
node.addEventListener(h, behaviorProvider.behaviors[h]);
}
}
}
} catch (err) {
if (top.bd && top.bd.devMode) {
console.log('Unable to attach behavior ' + behaviorProviders[i] + ': ' + err.message);
}
}
}
};
// Copied from foundation...
function require(sName) {
var oContext = window;
var aNameParts = sName.split('.');
if (aNameParts.length == 1 && aNameParts[0] == '')
return oContext;
for (var i = 0; i < aNameParts.length; i++) {
if (aNameParts[i] in oContext) {
oContext = oContext[aNameParts[i]];
} else {
var oError = new Error('Cannot find object "' + sName + '".');
// Be nice to Firefox
if (oError.stack) {
var sLastCall = oError.stack && oError.stack.split('\n')[2];
var aResults = sLastCall && sLastCall.match(/^[^@]*@(.*):(\d+)$/);
if (aResults && aResults[1] && aResults[2]) {
oError = new Error(oError.message, aResults[1], Number(aResults[2]));
}
}
throw oError;
}
}
return oContext;
};
var domReflector = new DOMReflector();
domReflector.getID = function(model) {
return 'VIEW-'+model._jxid;
}
domReflector.addToSet('default',[
new RFL_PM2Widget({'match':'Widget','localName':'widget'}),
new RFL_PM2CtrlwithTemplateName({'match':'Container','localName':'container'}),
new RFL_PM2CtrlwithTemplateName({'match':'Link','localName':'link'}),
new RFL_PM2CtrlwithTemplateName({'match':'Page','localName':'page'}),
new RFL_PortalModel2Control({'match':'Catalog','localName':'catalog'}),
new RFL_PortalModel2Control({'match':'Portal','localName':'portal'}),
new RFL_PortalModel2Control({'match':'Application','localName':'application'})
]);
/*
domReflector.addToSet('catalog',[
new RFL_PortalModel2Control({'match':'Widget','localName':'icon'}),
new RFL_PortalModel2Control({'match':'Container','localName':'icon'}),
new RFL_PortalModel2Control({'match':'Link','localName':'icon'}),
new RFL_PortalModel2Control({'match':'Page','localName':'icon'}),
new RFL_PortalModel2Control({'match':'Catalog','localName':'icon'}),
new RFL_PortalModel2Control({'match':'Portal','localName':'icon'}),
new RFL_PortalModel2Control({'match':'Application','localName':'icon'})
]);
*/
// TODO::: Shall we store this on the ownerDocument?????????
b$.portal.portalReflector = domReflector;
b$.portal.setController('portal', domReflector);
}